
#ifndef _RADIX_ENGINE_PARTICLE_H_
#define _RADIX_ENGINE_PARTICLE_H_

#include <Engine/Header.h>

_BeginNamespace(Radix)
/*
=================================================================
== Particle
=================================================================
*/
class IParticle :public Interface
{
public:
	virtual bool alive() = 0;
	virtual void alive(bool value) = 0;
	virtual const Vector3& position() = 0;
	virtual void position(const Vector3& pos) = 0;
	virtual const Vector3& velocity() = 0;
	virtual void velocity(const Vector3& vel) = 0;
	virtual const Vector3& acceler() = 0;
	virtual void acceler(const Vector3& acc) = 0;
	virtual const Color& color() = 0;
	virtual void color(const Color& col) = 0;
	virtual const String& texture() = 0;
	virtual void texture(const String& tex) = 0;
};
/*
=================================================================
== ParticleAttribute
=================================================================
*/
class IParticleAttribute :public Interface
{
public:

};
/*
=================================================================
== ParticleEmiter
=================================================================
*/
class IParticleEmiter :public Interface
{
public:
	virtual void emit(IParticle* particle) = 0;
};
/*
=================================================================
== ParticleAffector
=================================================================
*/
class IParticleAffector :public Interface
{
public:
	virtual void affect(IParticle* particle) = 0;
};
/*
=================================================================
== ParticleTemplate
=================================================================
*/
class IParticleTemplate :public Interface
{
public:
	virtual IParticleAttribute* attribute() = 0;
	virtual IParticleEmiter* emiter() = 0;
	virtual IParticleAffector* createAffector(const String& type) = 0;
};
/*
=================================================================
== ParticleCluster
=================================================================
*/
class IParticleCluster :public Interface
{
public:
	virtual const Vector3& position() = 0;
	virtual void position(const Vector3& pos) = 0;
	virtual const Vector4& orientation() = 0;
	virtual void orientation(const Vector4& ori) = 0;
};
/*
=================================================================
== ParticleSystem
=================================================================
*/
class IParticleSystem :public Interface
{
public:
	virtual IParticleTemplate* createTemplate(const String& name) = 0;
	virtual IParticleTemplate* selectTemplate(const String& name) = 0;
	virtual void deleteTemplate(const String& name) = 0;
	virtual void deleteTemplates() = 0;

	virtual IParticleCluster* createCluster(const String& name) = 0;
	virtual IParticleCluster* selectCluster(const String& name) = 0;
	virtual void deleteCluster(const String& name) = 0;
	virtual void deleteClusters() = 0;
};

_EndNamespace(Radix)

#endif//_RADIX_ENGINE_PARTICLE_H_
